/*
 * @Author: zengwj
 * @Date: 2022-08-09 15:09:34
 * @LastEditors: zengwj
 * @LastEditTime: 2022-08-17 14:33:24
 * @Description:
 */
// 依赖收集
export default function Dep() {
	this.watchers = []
}
// Dep.target 是一个静态属性，值为 null 或者 watcher 实例
// 在实例化 Watcher 时进行赋值，待依赖收集完成后在 Watcher 中又重新赋值为 null
Dep.target = null
/**
 * 收集 watcher
 * 在发生读取操作时（vm.xx) && 并且 Dep.target 不为 null 时进行依赖收集
 */
Dep.prototype.depend = function () {
	if (this.watchers.includes(Dep.target)) return
	this.watchers.push(Dep.target)
}

Dep.prototype.notify = function () {
	for (let watcher of this.watchers) {
		watcher.update()
	}
}
// 组件渲染有 Watcher，options 自定义的computed 和watcher 也会产生watcher,需要数组纪录 防止被覆盖
const targetStack = []

export function pushTarget(target) {
	targetStack.push(target)
	Dep.target = target
}

export function popTarget() {
	targetStack.pop()
	Dep.target = targetStack[targetStack.length - 1]
}
